package com.cskaoyan.javase.oop1._13block._1building._2usecase;

/**
 * 构造代码块的使用场景:
 *      1.由于构造代码块随着构造器而执行,并且其中的代码会最终加入类的每一个构造器
 *      利用这样的特点,"提取公因式"
 *      假如一段代码需要在类的每个构造器中写,那就写在构造代码块中
 *
 *      2.假如成员变量的初始化赋值,需要一个复杂的算法
 *      可以考虑构造代码块(不多见)
 *
 * @since 17:38
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*
            每new一次对象 构造代码块执行一次
            但是构造器并不一定只执行一个(最少执行一次)
         */
        for (int i = 0; i < 3; i++) {
            new Student();
        }
        for (int i = 0; i < 2; i++) {
            new Student(18);
        }
        for (int i = 0; i < 4; i++) {
            new Student(18, "张三", 1);
        }
        System.out.println(Student.count);
    }
}

class Student {
    static int count = 0;

    int age;
    String name;
    int id;

    {
        /*
            构造代码块可以看成是成员方法的方法体,这意味着:
                1.这里可以访问同类的成员以及静态成员
                2.定义的变量是局部变量
         */
        count++;
        // 局部变量a
        int a;
    }

    public Student() {

    }

    public Student(int age) {
        this.age = age;
    }

    public Student(int age, String name, int id) {
        this.age = age;
        this.name = name;
        this.id = id;
    }
}